package mx.gob.sat.cfd._2.comprobante;

import java.math.BigDecimal;
import java.math.BigInteger;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.datatype.XMLGregorianCalendar;


@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
    "emisor",
    "receptor",
    "conceptos",
    "impuestos",
    "complemento",
    "addenda"
})
@XmlRootElement(name="Comprobante", namespace="http://www.sat.gob.mx/cfd/2")
public class Comprobante {
    
    @XmlElement(name = "Emisor", namespace="http://www.sat.gob.mx/cfd/2", required = true)
    private Emisor emisor;
    @XmlElement(name = "Receptor", namespace="http://www.sat.gob.mx/cfd/2", required = true)
    private Receptor receptor;
    @XmlElement(name = "Conceptos", namespace="http://www.sat.gob.mx/cfd/2", required = true)
    private Conceptos conceptos;
    @XmlElement(name = "Impuestos", namespace="http://www.sat.gob.mx/cfd/2", required = true)
    private Impuestos impuestos;
    @XmlElement(name = "Complemento", namespace="http://www.sat.gob.mx/cfd/2")
    private Complemento complemento;
    @XmlElement(name = "Addenda", namespace="http://www.sat.gob.mx/cfd/2")
    private Addenda addenda;    
    @XmlAttribute(required = true)
    protected BigInteger anoAprobacion;
    @XmlAttribute
    protected String certificado;
    @XmlAttribute
    protected String condicionesDePago;
    @XmlAttribute
    protected BigDecimal descuento;
    @XmlAttribute(required = true)
    protected XMLGregorianCalendar fecha;
    @XmlAttribute(required = true)
    protected String folio;
    @XmlAttribute(required = true)
    protected String formaDePago;
    @XmlAttribute
    protected String metodoDePago;
    @XmlAttribute
    protected String motivoDescuento;
    @XmlAttribute(required = true)
    protected BigInteger noAprobacion;
    @XmlAttribute(required = true)
    protected String noCertificado;
    @XmlAttribute(required = true)
    protected String sello;
    @XmlAttribute
    protected String serie;
    @XmlAttribute(required = true)
    protected BigDecimal subTotal;
    @XmlAttribute(required = true)
    protected String tipoDeComprobante;
    @XmlAttribute(required = true)
    protected BigDecimal total;
    @XmlAttribute(required = true)
    protected String version;
    
    /**
     * Obtiene el valor del atributo anoAprobacion.
     * 
     * @return
     *     possible object is
     *     {@link BigInteger }
     *     
     */
    public BigInteger getAnoAprobacion() {
        return anoAprobacion;
    }

    /**
     * Establece el valor del atributo anoAprobacion.
     * 
     * @param value
     *     allowed object is
     *     {@link BigInteger }
     *     
     */
    public void setAnoAprobacion(BigInteger value) {
        this.anoAprobacion = value;
    }

    /**
     * Obtiene el valor del atributo certificado.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getCertificado() {
        return certificado;
    }

    /**
     * Establece el valor del atributo ceritificado.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setCertificado(String value) {
        this.certificado = value;
    }

    /**
     * Obtiene el valor del atributo condicionesDePago.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getCondicionesDePago() {
        return condicionesDePago;
    }

    /**
     * Establece el valor del atributo condicionesDePago.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setCondicionesDePago(String value) {
        this.condicionesDePago = value;
    }

    /**
     * Obtiene el valor del atributo descuento.
     * 
     * @return
     *     possible object is
     *     {@link BigDecimal }
     *     
     */
    public BigDecimal getDescuento() {
        return descuento;
    }

   
    public void setDescuento(BigDecimal value) {
        this.descuento = value;
    }

    /**
     * Obtiene el valor del atributo fecha.
     * 
     * @return
     *     possible object is
     *     {@link XMLGregorianCalendar }
     *     
     */
    public XMLGregorianCalendar getFecha() {
        return fecha;
    }

    /**
     * Establece el valor del atributo fecha.
     * 
     * @param value
     *     allowed object is
     *     {@link XMLGregorianCalendar }
     *     
     */
    public void setFecha(XMLGregorianCalendar value) {
        this.fecha = value;
    }

    /**
     * Obtiene el valor del atributo folio.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getFolio() {
        return folio;
    }

    /**
     * Establece el valor del atributo folio.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setFolio(String value) {
        this.folio = value;
    }

    /**
     * Obtiene el valor del atributo formaDePago.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getFormaDePago() {
        return formaDePago;
    }

    /**
     * Establece el valor del atributo formaDePago.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setFormaDePago(String value) {
        this.formaDePago = value;
    }

    /**
     * Obtiene el valor del atributo metodoDePago.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getMetodoDePago() {
        return metodoDePago;
    }

    /**
     * Establece el valor del atributo metodoDePago.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setMetodoDePago(String value) {
        this.metodoDePago = value;
    }

    /**
     * Obtiene el valor del atributo motivoDescuento.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getMotivoDescuento() {
        return motivoDescuento;
    }

    /**
     * Establece el valor del atributo motivoDescuento.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setMotivoDescuento(String value) {
        this.motivoDescuento = value;
    }

    /**
     * Obtiene el valor del atributo noAprobacion.
     * 
     * @return
     *     possible object is
     *     {@link BigInteger }
     *     
     */
    public BigInteger getNoAprobacion() {
        return noAprobacion;
    }

    /**
     * Establece el valor del atributo noAprobacion.
     * 
     * @param value
     *     allowed object is
     *     {@link BigInteger }
     *     
     */
    public void setNoAprobacion(BigInteger value) {
        this.noAprobacion = value;
    }

    /**
     * Obtiene el valor del atributo noCertificado property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getNoCertificado() {
        return noCertificado;
    }

    /**
     * Establece el valor del atributo noCertificado.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setNoCertificado(String value) {
        this.noCertificado = value;
    }

    /**
     * Obtiene el valor del atributo sello.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getSello() {
        return sello;
    }

    /**
     * Establce el valor del atributo sello.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setSello(String value) {
        this.sello = value;
    }

    /**
     * Obtiene el valor del atributo serie property.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getSerie() {
        return serie;
    }

    /**
     * Establece el valor del atributo serie.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setSerie(String value) {
        this.serie = value;
    }

    /**
     * Obtiene el valor del atributo subTotal.
     * 
     * @return
     *     possible object is
     *     {@link BigDecimal }
     *     
     */
    public BigDecimal getSubTotal() {
        return subTotal;
    }

    /**
     * Establece el valor del atributo subTotal.
     *
     * <p>Cuando se trata de establcer el valor para una variable de tipo BigDecimal, 
     *    el valor deber� ser representado con dos digitos despu�s del punto decimal</p>
     *  Representaci�n 
     *
     *  <p>setDecuento(value.setScale(2))</p>
     *
     * @param value
     *     allowed object is
     *     {@link BigDecimal }
     *     
     */
    public void setSubTotal(BigDecimal value) {
        this.subTotal = value;
    }

    /**
     * Ontiene el valor del atributo tipoDeComprobante.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getTipoDeComprobante() {
        return tipoDeComprobante;
    }

   
    public void setTipoDeComprobante(String value) {
        this.tipoDeComprobante = value;
    }

    /**
     * Obtiene el valor del atributo total.
     * 
     * @return
     *     possible object is
     *     {@link BigDecimal }
     *     
     */
    public BigDecimal getTotal() {
        return total;
    }

   
    public void setTotal(BigDecimal value) {
        this.total = value;
    }

    /**
     * Obtiene el valor del atributo version.
     * 
     * @return
     *     possible object is
     *     {@link String }
     *     
     */
    public String getVersion() {
        if (version == null) {
            return "2.0";
        } else {
            return version;
        }
    }

    /**
     * Establece el valor del atributo version.
     * 
     * @param value
     *     allowed object is
     *     {@link String }
     *     
     */
    public void setVersion(String value) {
        this.version = value;
    }
    
    public enum EnumTipoDeComprobante {
    
        ingreso,
    
        egreso,
    
        traslado,
    }

    /**
     * Obtiene el valor del elemento emisor.
     * 
     * @return
     *     possible object is
     *     {@link Emisor }
     *     
     */
    public Emisor getEmisor() {
        return emisor;
    }
    
    /**
     * Establece el valor del elemento emisor.
     * 
     * @param value
     *     allowed object is
     *     {@link Emisor }
     *     
     */
    public void setEmisor(Emisor emisor) {
        this.emisor = emisor;
    }

    /**
     * Obtiene el valor del elemento receptor.
     * 
     * @return
     *     possible object is
     *     {@link Receptor }
     *     
     */
    public Receptor getReceptor() {
        return receptor;
    }

    /**
     * Establece el valor del elemento receptor.
     * 
     * @param value
     *     allowed object is
     *     {@link Receptor }
     *     
     */
    public void setReceptor(Receptor receptor) {
        this.receptor = receptor;
    }

    /**
     * Obtiene el valor del elemento conceptos.
     * 
     * @return
     *     possible object is
     *     {@link Conceptos }
     *     
     */
    public Conceptos getConceptos() {
        return conceptos;
    }

    /**
     * Establece el valor del elemento conceptos.
     * 
     * @param value
     *     allowed object is
     *     {@link Conceptos }
     *     
     */
    public void setConceptos(Conceptos conceptos) {
        this.conceptos = conceptos;
    }

    /**
     * Obtiene el valor del elemento impuestos.
     * 
     * @return
     *     possible object is
     *     {@link Impuestos }
     *     
     */
    public Impuestos getImpuestos() {
        return impuestos;
    }

    /**
     * Establece el valor del elemento impuestos.
     * 
     * @param value
     *     allowed object is
     *     {@link Impuestos }
     *     
     */
    public void setImpuestos(Impuestos impuestos) {
        this.impuestos = impuestos;
    }

    /**
     * Obtiene el valor del elemento complemento.
     * 
     * @return
     *     possible object is
     *     {@link Complemento }
     *     
     */
    public Complemento getComplemento() {
        return complemento;
    }

    /**
     * Establece el valor del elemento complemento.
     * 
     * @param value
     *     allowed object is
     *     {@link Complemento }
     *     
     */
    public void setComplemento(Complemento complemento) {
        this.complemento = complemento;
    }

    /**
     * Obtiene el valor del elemento addenda.
     * 
     * @return
     *     possible object is
     *     {@link Addenda }
     *     
     */
    public Addenda getAddenda() {
        return addenda;
    }

    /**
     * Establece el valor del elemento addenda.
     * 
     * @param value
     *     allowed object is
     *     {@link Addenda }
     *     
     */
    public void setAddenda(Addenda addenda) {
        this.addenda = addenda;
    }
}
